package br.com.jspl.app.devices;

import java.awt.Component;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.LinkedList;

public class Cabo extends Componente {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Cursor cursorp;
	private boolean primeiroClick,Estado,atualizado;
	private int posPrimeiroClique;
	private Componente compPrimeiroClique;
	
	public void Paint(Graphics g) {
		
	}
	
	public Cabo(ProtoBoard p) {
		super("Cabo","CaboIco.png","CaboIco.png",p);
		cursorp = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
		primeiroClick = true;
		atualizado=false;
		setCusorpadrao();
		CriarEntradasSaidas(1,1);
	}
	
	public Cabo(String nomeComp, String nomedaImg,String IcoNome,ProtoBoard p) {
		super(nomeComp,nomedaImg,IcoNome,p);
		cursorp = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
		primeiroClick = true;
		atualizado=false;
		setCusorpadrao();
		CriarEntradasSaidas(1,1);
	}
	
	public void fuiCarregado(Point p1, Point p2) {
		Circuito c;
		LinkedList<Componente> l;
		int qtdComp,numE=0;
		int posCompD = 0;
		c=protoboard.getCircuitoAtual();
		l = c.getListaComponetes();
		qtdComp = l.size();
		Componente compAt;
		for(int x=0;x<qtdComp;x++) {
			compAt = (Componente) l.get(x);
			if (!(compAt instanceof Cabo)) {
				//Verifica o p1
				posCompD =compAt.ExisteConexao(p1);
				if(posCompD!=-1) {
					compAt.setComponenteLigadoConexao(posCompD,this);				
					EntradasSaidas[numE] = new conexao(p1,compAt.ComponenteLigadoConexao(posCompD),numE);
					numE++;
				}
				//Verifica o p2
				posCompD =compAt.ExisteConexao(p2);
				if(posCompD!=-1) {
					compAt.setComponenteLigadoConexao(posCompD,this);				
					EntradasSaidas[numE] = new conexao(p2,compAt.ComponenteLigadoConexao(posCompD),numE);
					numE++;
				}
			}
		}
	}
	
	//Sobrescreve a funcao da Class Pai, pois ele usa cursor padrao
	private void setCusorpadrao() {
		Cusorpadrao = true;
	}
	public Cursor getCursorpadrao() {
		return cursorp;
	}
	public void deletar() {
		
	}
	public Componente NovoComp() {
		//No cria outro Cabo.
		return new Cabo("Cabo","CaboIco.png","CaboIco.png",getProtoboard());
	}
	public boolean fuiClicado(ProtoBoard pb, MouseEvent evt) {
		Component comp = evt.getComponent();
		//Caso no tenha clicado em um componete
		if (evt.getSource() instanceof ProtoBoard) {
			if (!primeiroClick) {
				EntradasSaidas[0] = null;
				compPrimeiroClique.setComponenteLigadoConexao(posPrimeiroClique,null);
			}
			return true;
		}
		Componente compSelecionado = (Componente) comp;
		Point p = pb.getPosAtualSelec();
		//Se no achar uma conexao o cara clicou em lugar onde o comp no tem conexao
		int posCompD =compSelecionado.ExisteConexao(p); 
		if(posCompD == -1) {
			if (!primeiroClick) {
				EntradasSaidas[0] = null;
				compPrimeiroClique.setComponenteLigadoConexao(posPrimeiroClique,null);
			}
			return true;			
		}

		int numE;
		if (primeiroClick ) {
			numE = 0;
			primeiroClick = false;
			posPrimeiroClique = posCompD;
			compPrimeiroClique = compSelecionado;
		}
		else {
			 numE = 1;
		}
		
		compSelecionado.setComponenteLigadoConexao(posCompD,this);		
		EntradasSaidas[numE] = new conexao(p,compSelecionado.ComponenteLigadoConexao(posCompD),numE);			
		if (numE == 0 ) {
			return false;
		}
		else {
			Circuito c=pb.getCircuitoAtual();
			c.adicionaComponete(this);
			return true;
		}
		/*Graphics g = pb.getGraphics();
		
		g.drawOval(q.x-2,q.y-2,4,4);
		g.drawLine(p.x,p.y,q.x,q.y);
		g.dispose();*/	
	}
	
	public void desenhar(Graphics g) {	
		/**
		int Ox,Oy,Dx,Dy;
		Ox = EntradasSaidas[0].getX()*8;		
		Oy = EntradasSaidas[0].getY()*8;
		Dx = EntradasSaidas[1].getX()*8;
		Dy = EntradasSaidas[1].getY()*8;
		g.drawLine(Ox,Oy,Dx,Dy);
		*/
		int Ox,Oy,Dx,Dy;		
		int desX=3;
		Ox = EntradasSaidas[0].getX()*8;		
		Oy = EntradasSaidas[0].getY()*8;
		Dx = EntradasSaidas[1].getX()*8;
		Dy = EntradasSaidas[1].getY()*8;
		g.drawLine(Ox,Oy,Dx+desX,Oy);
		g.drawLine(Dx+desX,Oy,Dx+desX,Dy);
	}
	
	public boolean getEstado() {
		return Estado;
	}
	
	public void setEstado(boolean estado) {
		Estado = estado;
		atualizado = true;
	//	EntradasSaidas[0].setEstado(Estado);		
	//	EntradasSaidas[1].setEstado(Estado);
	}
	
	public boolean isAtualizado() {
		return atualizado;
	}
	
	protected boolean Resultado() {
		return Estado;
	}
	public void setAtualizado(boolean atualizado) {
		this.atualizado = atualizado;
	}
}